#!/bin/bash

# 主要用于检测 VIP 是否邦道在主库上，根据 etcd 中的 primary 值进行判断
# 为主键这添加VIP ，不为主库则卸载VIP
# 默认 1分钟执行一次
# 建议基于Haproxy ，减少脑裂风险

# 获取脚本路径
current_dir=$(cd $(dirname $0); pwd)
# 导入公共方法
source ${current_dir}/common.sh
# 导入配置文件
source ${current_dir}/config.cnf


function pg_set_vip_manager_patroni(){
  local array=(${etcd_cluster_ip//,/ })
  local endpoints=''
  for ip in "${array[@]}";do
    if [ -n "$endpoints" ]; then
        endpoints="${endpoints},"
    fi
    endpoints="${endpoints}${ip}:${ectd_client_port}"    
  done

  echo $endpoints
  cat > ${pg_dir}/patroni/bin/pg_vip_manager_patroni.sh << EOF

ip2util=$(which ip)
etcd2util=$(which etcdctl)
VIP=${vip}
INF=$(ip addr show |grep ${local_ip}|awk '{print $NF}')

export ETCDCTL_API=3
PRIMARY=\$(\$etcd2util --endpoints=$endpoints get ${pg_dir}/patroni/pgsql/leader|grep -v ${pg_dir}/patroni/pgsql/leader)
if [ \$? -gt 0 ];then
  echo "\$(date +"%Y-%m-%d %H:%M:%S") 获取 etcd  信息异常!"
  exit 1
fi


CHK_IS_PRIMARY=\$(\$ip2util -4 a|grep \$PRIMARY|wc -l)
CHK_VIP_STATUS=\$(\$ip2util -4 a|grep \$VIP|wc -l)

# 当前为主
if [ "\$CHK_IS_PRIMARY" -gt 0 ] && [ \$PRIMARY ];then
  # 当前为主实例
  if [ "\$CHK_VIP_STATUS" -eq 0 ];then
    echo "\$(date +"%Y-%m-%d %H:%M:%S") 在[\$PRIMARY]执行添加VIP"
    \$ip2util address add \${VIP} dev \${INF}
  fi
else
  # 当前不为主实例，删除VIP
  if [ "\$CHK_VIP_STATUS" -gt 0 ];then
    echo "\$(date +"%Y-%m-%d %H:%M:%S") 执行卸载VIP"
    \$ip2util address del \${VIP} dev \${INF}
  fi
fi

EOF

  chmod +x ${pg_dir}/patroni/bin/pg_vip_manager_patroni.sh
}

# 添加
function add_cron(){
  cat > /etc/cron.d/pg_vip_manager_patroni.sh << EOF
*/1 * * * * root ${pg_dir}/patroni/bin/pg_vip_manager_patroni.sh >> ${pg_dir}/patroni/log/pg_vip_manager_patroni.log
EOF
}


function main(){
  if [ "$1" == "set" ];then
    comm_print_note "生成 vip_manager_patroni 脚本，并设置定时任务，用于检测VIP是否存在于主库.."
    pg_set_vip_manager_patroni
    add_cron
  elif [ "$1" == "clear" ];then
    comm_print_note "删除定时任务：/etc/cron.d/pg_vip_manager_patroni.sh"
    rm -f /etc/cron.d/pg_vip_manager_patroni.sh
    if [ -f ${pg_dir}/patroni/bin/pg_vip_manager_patroni.sh ];then
      comm_print_note "删除 vip_manager 脚本：${pg_dir}/patroni/bin/pg_vip_manager_patroni.sh"
      rm -f ${pg_dir}/patroni/bin/pg_vip_manager_patroni.sh
    fi
  else
    echo "
     $0 set     生成 vip_manager_patroni 脚本，用于检测VIP是否存在于主库,主不存在VIP则添加，从存在VIP则卸载
                                   默认路径：${pg_dir}/patroni/bin/pg_vip_manager_patroni.sh
                                   默认定时任务：/etc/cron.d/pg_vip_manager_patroni.sh
     $0 clear   卸载vip管理脚本与停止定时任务"
  fi
}

main $1
